home *** CD-ROM | disk | FTP | other *** search
Wrap
package koala.dynamicjava.interpreter; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Modifier; import koala.dynamicjava.classfile.AttributeOwnerComponent; import koala.dynamicjava.classfile.BytecodeComponent; import koala.dynamicjava.classfile.ClassFile; import koala.dynamicjava.classfile.ClassIdentifier; import koala.dynamicjava.classfile.CodeAttribute; import koala.dynamicjava.classfile.ConstantPool; import koala.dynamicjava.classfile.ConstantString; import koala.dynamicjava.classfile.ExceptionsAttribute; import koala.dynamicjava.classfile.FieldInfo; import koala.dynamicjava.classfile.InnerClassesAttribute; import koala.dynamicjava.classfile.InnerClassesEntry; import koala.dynamicjava.classfile.JVMUtilities; import koala.dynamicjava.classfile.MethodIdentifier; import koala.dynamicjava.classfile.MethodInfo; public class ClassFactory extends ClassFile { private static final String VOID_NAME = JVMUtilities.getName("void"); private static final String BOOLEAN_NAME = JVMUtilities.getName("boolean"); private static final String CHAR_NAME = JVMUtilities.getName("char"); private static final String INT_NAME = JVMUtilities.getName("int"); private static final String LONG_NAME = JVMUtilities.getName("long"); private static final String FLOAT_NAME = JVMUtilities.getName("float"); private static final String DOUBLE_NAME = JVMUtilities.getName("double"); private static final String BYTE_NAME = JVMUtilities.getName("byte"); private static final String SHORT_NAME = JVMUtilities.getName("short"); private static final String OBJECT_NAME = JVMUtilities.getName("java.lang.Object"); private static final String BOOLEAN_WRAPPER_NAME = JVMUtilities.getName("java.lang.Boolean"); private static final String CHAR_WRAPPER_NAME = JVMUtilities.getName("java.lang.Character"); private static final String INT_WRAPPER_NAME = JVMUtilities.getName("java.lang.Integer"); private static final String LONG_WRAPPER_NAME = JVMUtilities.getName("java.lang.Long"); private static final String FLOAT_WRAPPER_NAME = JVMUtilities.getName("java.lang.Float"); private static final String DOUBLE_WRAPPER_NAME = JVMUtilities.getName("java.lang.Double"); private static final String BYTE_WRAPPER_NAME = JVMUtilities.getName("java.lang.Byte"); private static final String SHORT_WRAPPER_NAME = JVMUtilities.getName("java.lang.Short"); private static final String NUMBER_NAME = JVMUtilities.getName("java.lang.Number"); private static final ClassIdentifier BOOLEAN_IDENTIFIER; private static final MethodIdentifier BOOLEAN_CONSTRUCTOR; private static final ClassIdentifier CHARACTER_IDENTIFIER; private static final MethodIdentifier CHARACTER_CONSTRUCTOR; private static final ClassIdentifier INTEGER_IDENTIFIER; private static final MethodIdentifier INTEGER_CONSTRUCTOR; private static final ClassIdentifier LONG_IDENTIFIER; private static final MethodIdentifier LONG_CONSTRUCTOR; private static final ClassIdentifier FLOAT_IDENTIFIER; private static final MethodIdentifier FLOAT_CONSTRUCTOR; private static final ClassIdentifier DOUBLE_IDENTIFIER; private static final MethodIdentifier DOUBLE_CONSTRUCTOR; private static final ClassIdentifier BYTE_IDENTIFIER; private static final MethodIdentifier BYTE_CONSTRUCTOR; private static final ClassIdentifier SHORT_IDENTIFIER; private static final MethodIdentifier SHORT_CONSTRUCTOR; private static final ClassIdentifier OBJECT_IDENTIFIER; private static final ClassIdentifier NUMBER_IDENTIFIER; private static final MethodIdentifier BOOLEAN_BOOLEAN_VALUE_METHOD; private static final MethodIdentifier CHARACTER_CHAR_VALUE_METHOD; private static final MethodIdentifier NUMBER_INT_VALUE_METHOD; private static final MethodIdentifier NUMBER_LONG_VALUE_METHOD; private static final MethodIdentifier NUMBER_FLOAT_VALUE_METHOD; private static final MethodIdentifier NUMBER_DOUBLE_VALUE_METHOD; private static final MethodIdentifier NUMBER_BYTE_VALUE_METHOD; private static final MethodIdentifier NUMBER_SHORT_VALUE_METHOD; private String name; private String superName; private boolean isStaticClass; private MethodIdentifier interpreterMethod; private MethodIdentifier interpretArgumentsMethod; private MethodIdentifier thrownExceptionMethod; private String thrownExceptionName; private InnerClassesAttribute innerClassesAttribute; private String classLoaderId; public static String getMethodIdentifier(String var0, String var1, String[] var2, String var3) { String var4 = var0 + "#" + var1 + "("; if (var2.length > 0) { var4 = var4 + var2[0]; } for(int var5 = 1; var5 < var2.length; ++var5) { var4 = var4 + "," + var2[var5]; } return var4 + ")" + var3; } public String createClassInitializer() { try { MethodInfo var1 = ((ClassFile)this).createMethod("void", "<clinit>", new String[0]); String var2 = getMethodIdentifier(this.name, "<clinit>", new String[0], this.classLoaderId); var1.setAccessFlags(8); ConstantPool var3 = ((ClassFile)this).getConstantPool(); ByteArrayOutputStream var4 = new ByteArrayOutputStream(); DataOutputStream var5 = new DataOutputStream(var4); this.bipush(0, var5); var5.writeByte(189); short var7 = var3.put(OBJECT_IDENTIFIER); var5.writeShort(var7); this.astore(0, var5); var7 = var3.put(new ConstantString(var2)); if (var7 > 256) { var5.writeByte(19); var5.writeShort(var7); } else { var5.writeByte(18); var5.writeByte(var7); } var5.writeByte(1); this.aload(0, var5); var5.writeByte(184); var5.writeShort(var3.put(this.interpreterMethod)); var5.writeByte(177); CodeAttribute var8 = var1.createCodeAttribute(); var8.setCode(var4.toByteArray(), (short)1, (short)6); return var2; } catch (IOException var9) { var9.printStackTrace(); return null; } } public String addConstructor(int var1, String[] var2, String[] var3, String var4, String[] var5) { try { String var6 = getMethodIdentifier(this.name, "<init>", var2, this.classLoaderId); MethodInfo var7 = ((ClassFile)this).createMethod("void", "<init>", var2); var7.setAccessFlags(var1); ConstantPool var8 = ((ClassFile)this).getConstantPool(); ByteArrayOutputStream var9 = new ByteArrayOutputStream(); DataOutputStream var10 = new DataOutputStream(var9); short var11 = 6; short var12 = 3; for(int var13 = 0; var13 < var2.length; ++var13) { String var14 = var2[var13]; if (!var14.equals("long") && !var14.equals("double")) { ++var12; } else { var12 = (short)(var12 + 2); } } short var23 = var12; for(int var24 = 0; var24 < var5.length; ++var24) { String var15 = var5[var24]; if (!var15.equals("long") && !var15.equals("double")) { ++var12; ++var11; } else { var12 = (short)(var12 + 2); var11 = (short)(var11 + 2); } } this.bipush(var2.length, var10); var10.writeByte(189); short var25 = var8.put(OBJECT_IDENTIFIER); var10.writeShort(var25); if (var23 < 5) { var10.writeByte(75 + var23 - 1); } else { var10.writeByte(58); var10.writeByte(var23 - 1); } int var29 = 1; for(int var16 = 0; var16 < var2.length; ++var16) { String var17 = var2[var16]; this.aload(var23 - 1, var10); this.bipush(var16, var10); if (var17.equals("int")) { this.loadInt(var29, var10, var8); } else if (var17.equals("long")) { this.loadLong(var29, var10, var8); ++var29; } else if (var17.equals("float")) { this.loadFloat(var29, var10, var8); } else if (var17.equals("double")) { this.loadDouble(var29, var10, var8); ++var29; } else if (var17.equals("byte")) { this.loadByte(var29, var10, var8); } else if (var17.equals("short")) { this.loadShort(var29, var10, var8); } else if (var17.equals("boolean")) { this.loadBoolean(var29, var10, var8); } else if (var17.equals("char")) { this.loadChar(var29, var10, var8); } else { this.aload(var29, var10); } var10.writeByte(83); ++var29; } short var32 = (short)var10.size(); var25 = var8.put(new ConstantString(var6)); if (var25 > 256) { var10.writeByte(19); var10.writeShort(var25); } else { var10.writeByte(18); var10.writeByte(var25); } this.aload(var23 - 1, var10); var10.writeByte(184); var10.writeShort(var8.put(this.interpretArgumentsMethod)); this.astore(var23 - 2, var10); var29 = var23; for(int var33 = 0; var33 < var5.length; ++var33) { String var18 = var5[var33]; this.aload(var23 - 2, var10); this.bipush(var33, var10); var10.writeByte(50); if (var18.equals("int")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_INT_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(59 + var29); } else { var10.writeByte(54); var10.writeByte(var29); } } else if (var18.equals("long")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_LONG_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(63 + var29); } else { var10.writeByte(55); var10.writeByte(var29); } ++var29; } else if (var18.equals("float")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_FLOAT_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(67 + var29); } else { var10.writeByte(56); var10.writeByte(var29); } } else if (var18.equals("double")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_DOUBLE_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(71 + var29); } else { var10.writeByte(57); var10.writeByte(var29); } ++var29; } else if (var18.equals("byte")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_BYTE_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(59 + var29); } else { var10.writeByte(54); var10.writeByte(var29); } } else if (var18.equals("short")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_SHORT_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(59 + var29); } else { var10.writeByte(54); var10.writeByte(var29); } } else if (var18.equals("boolean")) { var10.writeByte(192); var10.writeShort(var8.put(BOOLEAN_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(BOOLEAN_BOOLEAN_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(59 + var29); } else { var10.writeByte(54); var10.writeByte(var29); } } else if (var18.equals("char")) { var10.writeByte(192); var10.writeShort(var8.put(CHARACTER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(CHARACTER_CHAR_VALUE_METHOD)); if (var29 < 4) { var10.writeByte(59 + var29); } else { var10.writeByte(54); var10.writeByte(var29); } } else { this.astore(var29, var10); } ++var29; } var10.writeByte(42); var29 = var23; for(int var34 = 0; var34 < var5.length; ++var34) { String var37 = var5[var34]; if (var37.equals("int")) { this.iload(var29, var10); } else if (var37.equals("long")) { if (var29 < 4) { var10.writeByte(30 + var29); } else { var10.writeByte(22); var10.writeByte(var29); } ++var29; } else if (var37.equals("float")) { if (var29 < 4) { var10.writeByte(34 + var29); } else { var10.writeByte(23); var10.writeByte(var29); } } else if (var37.equals("double")) { if (var29 < 4) { var10.writeByte(38 + var29); } else { var10.writeByte(24); var10.writeByte(var29); } ++var29; } else if (var37.equals("byte")) { this.iload(var29, var10); } else if (var37.equals("short")) { this.iload(var29, var10); } else if (var37.equals("boolean")) { this.iload(var29, var10); } else if (var37.equals("char")) { this.iload(var29, var10); } else { this.aload(var29, var10); var10.writeByte(192); var10.writeShort(var8.put(new ClassIdentifier(JVMUtilities.getName(var5[var34])))); } ++var29; } var10.writeByte(183); for(int var35 = 0; var35 < var5.length; ++var35) { var5[var35] = JVMUtilities.getParameterTypeName(var5[var35]); } MethodIdentifier var36 = new MethodIdentifier(JVMUtilities.getName(var4), "<init>", JVMUtilities.getName("void"), var5); var10.writeShort(var8.put(var36)); var25 = var8.put(new ConstantString(var6)); if (var25 > 256) { var10.writeByte(19); var10.writeShort(var25); } else { var10.writeByte(18); var10.writeByte(var25); } var10.writeByte(42); this.aload(var23 - 1, var10); var10.writeByte(184); var10.writeShort(var8.put(this.interpreterMethod)); var10.writeByte(177); short var38 = (short)var10.size(); if (var3.length > 0) { var12 = (short)(var12 + 2); this.astore(var12 - 2, var10); this.aload(var12 - 2, var10); var10.writeByte(182); var10.writeShort(var8.put(this.thrownExceptionMethod)); this.astore(var12 - 1, var10); for(int var19 = 0; var19 < var3.length; ++var19) { this.aload(var12 - 1, var10); var10.writeByte(193); var25 = var8.put(new ClassIdentifier(JVMUtilities.getName(var3[var19]))); var10.writeShort(var25); var10.writeByte(153); if (var12 < 5) { var10.writeShort(8); } else { var10.writeShort(9); } this.aload(var12 - 1, var10); var10.writeByte(192); var10.writeShort(var25); var10.writeByte(191); } this.aload(var12 - 2, var10); var10.writeByte(191); } CodeAttribute var39 = var7.createCodeAttribute(); var39.setCode(var9.toByteArray(), var12, var11); if (var3.length > 0) { var39.addExceptionTableEntry(var32, var38, var38, this.thrownExceptionName); } if (var3.length > 0) { ExceptionsAttribute var20 = var7.createExceptionsAttribute(); for(int var21 = 0; var21 < var3.length; ++var21) { var20.addException(var3[var21]); } } return var6; } catch (IOException var22) { var22.printStackTrace(); return null; } } public void addField(int var1, String var2, String var3) { FieldInfo var4 = ((ClassFile)this).createField(var2, var3); var4.setAccessFlags(var1); } public void addConstantIntField(int var1, String var2, String var3, Integer var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(var4); } public void addConstantLongField(int var1, String var2, String var3, Long var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(var4); } public void addConstantFloatField(int var1, String var2, String var3, Float var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(var4); } public void addConstantDoubleField(int var1, String var2, String var3, Double var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(var4); } public void addConstantBooleanField(int var1, String var2, String var3, Boolean var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(new Integer(var4 ? 1 : 0)); } public void addConstantStringField(int var1, String var2, String var3, String var4) { FieldInfo var5 = ((ClassFile)this).createField(var2, var3); var5.setAccessFlags(var1); var5.setConstantValueAttribute(var4); } public InnerClassesEntry addInnerClassesEntry() { if (this.innerClassesAttribute == null) { this.innerClassesAttribute = new InnerClassesAttribute(((ClassFile)this).getConstantPool()); ((ClassFile)this).setInnerClassesAttribute(this.innerClassesAttribute); } return this.innerClassesAttribute.addInnerClassesEntry(); } public void addSuperMethodAccessor(int var1, String var2, String var3, String[] var4, String[] var5) { try { MethodInfo var6 = ((ClassFile)this).createMethod(var2, "super$" + var3, var4); var6.setAccessFlags(1); ConstantPool var7 = ((ClassFile)this).getConstantPool(); ByteArrayOutputStream var8 = new ByteArrayOutputStream(); DataOutputStream var9 = new DataOutputStream(var8); boolean var11 = Modifier.isStatic(var1); short var12 = (short)(var11 ? 1 : 2); for(int var14 = 0; var14 < var4.length; ++var14) { String var15 = var4[var14]; if (!var15.equals("long") && !var15.equals("double")) { ++var12; } else { var12 = (short)(var12 + 2); } } int var20 = 0; if (!var11) { var9.writeByte(42); var20 = 1; } for(int var21 = 0; var21 < var4.length; ++var21) { String var16 = var4[var21]; if (var16.equals("int")) { this.iload(var20, var9); } else if (var16.equals("long")) { if (var20 < 4) { var9.writeByte(30 + var20); } else { var9.writeByte(22); var9.writeByte(var20); } ++var20; } else if (var16.equals("float")) { if (var20 < 4) { var9.writeByte(34 + var20); } else { var9.writeByte(23); var9.writeByte(var20); } } else if (var16.equals("double")) { if (var20 < 4) { var9.writeByte(38 + var20); } else { var9.writeByte(24); var9.writeByte(var20); } ++var20; } else if (var16.equals("byte")) { this.iload(var20, var9); } else if (var16.equals("short")) { this.iload(var20, var9); } else if (var16.equals("boolean")) { this.iload(var20, var9); } else if (var16.equals("char")) { this.iload(var20, var9); } else { this.aload(var20, var9); var9.writeByte(192); var9.writeShort(var7.put(new ClassIdentifier(JVMUtilities.getName(var4[var21])))); } ++var20; } String[] var22 = new String[var4.length]; for(int var23 = 0; var23 < var4.length; ++var23) { var22[var23] = JVMUtilities.getParameterTypeName(var4[var23]); } MethodIdentifier var13 = new MethodIdentifier(JVMUtilities.getName(this.superName), var3, JVMUtilities.getReturnTypeName(var2), var22); if (var11) { var9.writeByte(184); } else { var9.writeByte(183); } var9.writeShort(var7.put(var13)); if (var2.equals("void")) { var9.writeByte(177); } else if (var2.equals("int")) { var9.writeByte(172); } else if (var2.equals("long")) { var9.writeByte(173); } else if (var2.equals("float")) { var9.writeByte(174); } else if (var2.equals("double")) { var9.writeByte(175); } else if (var2.equals("byte")) { var9.writeByte(172); } else if (var2.equals("short")) { var9.writeByte(172); } else if (var2.equals("boolean")) { var9.writeByte(172); } else if (var2.equals("char")) { var9.writeByte(172); } else { var9.writeByte(176); } CodeAttribute var24 = var6.createCodeAttribute(); var24.setCode(var8.toByteArray(), var12, var12); if (var5.length > 0) { ExceptionsAttribute var17 = var6.createExceptionsAttribute(); for(int var18 = 0; var18 < var5.length; ++var18) { var17.addException(var5[var18]); } } } catch (IOException var19) { var19.printStackTrace(); } } public String addMethod(int var1, String var2, String var3, String[] var4, String[] var5) { try { MethodInfo var6 = ((ClassFile)this).createMethod(var2, var3, var4); String var7 = getMethodIdentifier(this.name, var3, var4, this.classLoaderId); var6.setAccessFlags(var1); if (!var6.isAbstract()) { ConstantPool var8 = ((ClassFile)this).getConstantPool(); ByteArrayOutputStream var9 = new ByteArrayOutputStream(); DataOutputStream var10 = new DataOutputStream(var9); byte var11 = 6; short var12 = (short)(var6.isStatic() ? 1 : 2); for(int var14 = 0; var14 < var4.length; ++var14) { String var15 = var4[var14]; if (!var15.equals("long") && !var15.equals("double")) { ++var12; } else { var12 = (short)(var12 + 2); } } this.bipush(var4.length, var10); var10.writeByte(189); short var22 = var8.put(OBJECT_IDENTIFIER); var10.writeShort(var22); this.astore(var12 - 1, var10); int var25 = var6.isStatic() ? 0 : 1; for(int var16 = 0; var16 < var4.length; ++var16) { String var17 = var4[var16]; this.aload(var12 - 1, var10); this.bipush(var16, var10); if (var17.equals("int")) { this.loadInt(var25, var10, var8); } else if (var17.equals("long")) { this.loadLong(var25, var10, var8); ++var25; } else if (var17.equals("float")) { this.loadFloat(var25, var10, var8); } else if (var17.equals("double")) { this.loadDouble(var25, var10, var8); ++var25; } else if (var17.equals("byte")) { this.loadByte(var25, var10, var8); } else if (var17.equals("short")) { this.loadShort(var25, var10, var8); } else if (var17.equals("boolean")) { this.loadBoolean(var25, var10, var8); } else if (var17.equals("char")) { this.loadChar(var25, var10, var8); } else { this.aload(var25, var10); } var10.writeByte(83); ++var25; } short var26 = (short)var10.size(); var22 = var8.put(new ConstantString(var7)); if (var22 > 256) { var10.writeByte(19); var10.writeShort(var22); } else { var10.writeByte(18); var10.writeByte(var22); } if (var6.isStatic()) { var10.writeByte(1); } else { var10.writeByte(42); } this.aload(var12 - 1, var10); var10.writeByte(184); var10.writeShort(var8.put(this.interpreterMethod)); if (var2.equals("void")) { var10.writeByte(177); } else if (var2.equals("int")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_INT_VALUE_METHOD)); var10.writeByte(172); } else if (var2.equals("long")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_LONG_VALUE_METHOD)); var10.writeByte(173); } else if (var2.equals("float")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_FLOAT_VALUE_METHOD)); var10.writeByte(174); } else if (var2.equals("double")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_DOUBLE_VALUE_METHOD)); var10.writeByte(175); } else if (var2.equals("byte")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_BYTE_VALUE_METHOD)); var10.writeByte(172); } else if (var2.equals("short")) { var10.writeByte(192); var10.writeShort(var8.put(NUMBER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(NUMBER_SHORT_VALUE_METHOD)); var10.writeByte(172); } else if (var2.equals("boolean")) { var10.writeByte(192); var10.writeShort(var8.put(BOOLEAN_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(BOOLEAN_BOOLEAN_VALUE_METHOD)); var10.writeByte(172); } else if (var2.equals("char")) { var10.writeByte(192); var10.writeShort(var8.put(CHARACTER_IDENTIFIER)); var10.writeByte(182); var10.writeShort(var8.put(CHARACTER_CHAR_VALUE_METHOD)); var10.writeByte(172); } else { var10.writeByte(192); var10.writeShort(var8.put(new ClassIdentifier(JVMUtilities.getName(var2)))); var10.writeByte(176); } short var27 = (short)var10.size(); if (var5.length > 0) { var12 = (short)(var12 + 2); this.astore(var12 - 2, var10); this.aload(var12 - 2, var10); var10.writeByte(182); var10.writeShort(var8.put(this.thrownExceptionMethod)); this.astore(var12 - 1, var10); for(int var18 = 0; var18 < var5.length; ++var18) { this.aload(var12 - 1, var10); var10.writeByte(193); var22 = var8.put(new ClassIdentifier(JVMUtilities.getName(var5[var18]))); var10.writeShort(var22); var10.writeByte(153); if (var12 < 5) { var10.writeShort(8); } else { var10.writeShort(9); } this.aload(var12 - 1, var10); var10.writeByte(192); var10.writeShort(var22); var10.writeByte(191); } this.aload(var12 - 2, var10); var10.writeByte(191); } CodeAttribute var28 = var6.createCodeAttribute(); var28.setCode(var9.toByteArray(), var12, var11); if (var5.length > 0) { var28.addExceptionTableEntry(var26, var27, var27, this.thrownExceptionName); } } if (var5.length > 0) { ExceptionsAttribute var20 = var6.createExceptionsAttribute(); for(int var21 = 0; var21 < var5.length; ++var21) { var20.addException(var5[var21]); } } return var7; } catch (IOException var19) { var19.printStackTrace(); return null; } } public byte[] getByteCode() { ByteArrayOutputStream var1 = new ByteArrayOutputStream(); try { ((BytecodeComponent)this).write(var1); } catch (IOException var3) { var3.printStackTrace(); } return var1.toByteArray(); } private void iload(int var1, DataOutputStream var2) throws IOException { if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } } private void aload(int var1, DataOutputStream var2) throws IOException { if (var1 < 4) { var2.writeByte(42 + var1); } else { var2.writeByte(25); var2.writeByte(var1); } } private void astore(int var1, DataOutputStream var2) throws IOException { if (var1 < 4) { var2.writeByte(75 + var1); } else { var2.writeByte(58); var2.writeByte(var1); } } private void bipush(int var1, DataOutputStream var2) throws IOException { if (var1 < 6) { var2.writeByte(3 + var1); } else { var2.writeByte(16); var2.writeByte(var1); } } private void loadInt(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(INTEGER_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(INTEGER_CONSTRUCTOR)); } private void loadLong(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(LONG_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(30 + var1); } else { var2.writeByte(22); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(LONG_CONSTRUCTOR)); } private void loadFloat(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(FLOAT_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(34 + var1); } else { var2.writeByte(23); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(FLOAT_CONSTRUCTOR)); } private void loadDouble(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(DOUBLE_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(38 + var1); } else { var2.writeByte(24); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(DOUBLE_CONSTRUCTOR)); } private void loadByte(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(BYTE_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(BYTE_CONSTRUCTOR)); } private void loadShort(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(SHORT_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(SHORT_CONSTRUCTOR)); } private void loadBoolean(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(BOOLEAN_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(BOOLEAN_CONSTRUCTOR)); } private void loadChar(int var1, DataOutputStream var2, ConstantPool var3) throws IOException { var2.writeByte(187); var2.writeShort(var3.put(CHARACTER_IDENTIFIER)); var2.writeByte(89); if (var1 < 4) { var2.writeByte(26 + var1); } else { var2.writeByte(21); var2.writeByte(var1); } var2.writeByte(183); var2.writeShort(var3.put(CHARACTER_CONSTRUCTOR)); } public ClassFactory(int var1, String var2, String var3, Class var4, Class var5, String var6) { super(var2, var3); this.name = var2; this.superName = var3; this.classLoaderId = var6; this.isStaticClass = (var1 & 8) != 0; int var7 = var1 & -3 & -5 & -9; ((AttributeOwnerComponent)this).setAccessFlags(var7 | 32 | (this.isStaticClass ? 1 : 0)); String var8 = var4.getName(); this.interpreterMethod = new MethodIdentifier(JVMUtilities.getName(var8), "invokeMethod", JVMUtilities.getReturnTypeName("java.lang.Object"), new String[]{JVMUtilities.getParameterTypeName("java.lang.String"), JVMUtilities.getParameterTypeName("java.lang.Object"), JVMUtilities.getParameterTypeName("java.lang.Object[]")}); this.interpretArgumentsMethod = new MethodIdentifier(JVMUtilities.getName(var8), "interpretArguments", JVMUtilities.getReturnTypeName("java.lang.Object[]"), new String[]{JVMUtilities.getParameterTypeName("java.lang.String"), JVMUtilities.getParameterTypeName("java.lang.Object[]")}); this.thrownExceptionName = var5.getName(); this.thrownExceptionMethod = new MethodIdentifier(JVMUtilities.getName(this.thrownExceptionName), "getException", JVMUtilities.getReturnTypeName("java.lang.Exception"), new String[0]); } static { BOOLEAN_IDENTIFIER = new ClassIdentifier(BOOLEAN_WRAPPER_NAME); BOOLEAN_CONSTRUCTOR = new MethodIdentifier(BOOLEAN_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{BOOLEAN_NAME}); CHARACTER_IDENTIFIER = new ClassIdentifier(CHAR_WRAPPER_NAME); CHARACTER_CONSTRUCTOR = new MethodIdentifier(CHAR_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{CHAR_NAME}); INTEGER_IDENTIFIER = new ClassIdentifier(INT_WRAPPER_NAME); INTEGER_CONSTRUCTOR = new MethodIdentifier(INT_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{INT_NAME}); LONG_IDENTIFIER = new ClassIdentifier(LONG_WRAPPER_NAME); LONG_CONSTRUCTOR = new MethodIdentifier(LONG_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{LONG_NAME}); FLOAT_IDENTIFIER = new ClassIdentifier(FLOAT_WRAPPER_NAME); FLOAT_CONSTRUCTOR = new MethodIdentifier(FLOAT_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{FLOAT_NAME}); DOUBLE_IDENTIFIER = new ClassIdentifier(DOUBLE_WRAPPER_NAME); DOUBLE_CONSTRUCTOR = new MethodIdentifier(DOUBLE_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{DOUBLE_NAME}); BYTE_IDENTIFIER = new ClassIdentifier(BYTE_WRAPPER_NAME); BYTE_CONSTRUCTOR = new MethodIdentifier(BYTE_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{BYTE_NAME}); SHORT_IDENTIFIER = new ClassIdentifier(SHORT_WRAPPER_NAME); SHORT_CONSTRUCTOR = new MethodIdentifier(SHORT_WRAPPER_NAME, "<init>", VOID_NAME, new String[]{SHORT_NAME}); OBJECT_IDENTIFIER = new ClassIdentifier(OBJECT_NAME); NUMBER_IDENTIFIER = new ClassIdentifier(NUMBER_NAME); BOOLEAN_BOOLEAN_VALUE_METHOD = new MethodIdentifier(BOOLEAN_WRAPPER_NAME, "booleanValue", BOOLEAN_NAME, new String[0]); CHARACTER_CHAR_VALUE_METHOD = new MethodIdentifier(CHAR_WRAPPER_NAME, "charValue", CHAR_NAME, new String[0]); NUMBER_INT_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "intValue", INT_NAME, new String[0]); NUMBER_LONG_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "longValue", LONG_NAME, new String[0]); NUMBER_FLOAT_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "floatValue", FLOAT_NAME, new String[0]); NUMBER_DOUBLE_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "doubleValue", DOUBLE_NAME, new String[0]); NUMBER_BYTE_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "byteValue", BYTE_NAME, new String[0]); NUMBER_SHORT_VALUE_METHOD = new MethodIdentifier(NUMBER_NAME, "shortValue", SHORT_NAME, new String[0]); } }